//ArrayList与顺序表：

package listdemo;

import java.util.Arrays;

/**
 * 写一个顺序表，能够进行增删查改的操作
 */

public class MyArrayList implements IList{
    public int[] elem;//定义一个数组，在数组上进行操作
    public int usedSize;//记录数组中有效数据的个数

    public MyArrayList() {//构造方法
        this.elem = new int[10];//为数组分配内存
    }

    /**
     * 把data放在数组中有效数据的最后一个位置
     * 需要考虑的问题：数组满了怎么放？——判满、扩容
     * @param data
     */
    @Override
    public void add(int data) {
        if (isFull()) {
            resize();
        }
        elem[usedSize] = data;
        usedSize++;
    }

    private void resize() {//扩容方法，定义为private，不期望被其它方法或对象进行调用
        elem = Arrays.copyOf(elem, 2 * elem.length);//扩容2倍
    }

    @Override
    public boolean isFull() {
        return usedSize == elem.length;//true为满
    }

    /**
     * 把数据data存放在指定位置，与上面的add方法构成重载
     * @param pos
     * @param data
     */
    @Override
    public void add(int pos, int data) {
        if (pos < 0 || pos >usedSize) {
            //return;
            throw new PostOutOfException("pos位置不合法");//抛出异常
        }

        if (isFull()) {//0.判断数组是否为满
            resize();
        }

        for (int i = usedSize - 1; i >= pos ; i--) {//1.数据挪动
            elem[i + 1] = elem[i];
        }
        elem[pos] = data;//2.数据存放
        usedSize++;
    }

    /**
     * 找到数据tofind，返回true或false
     * @param toFind
     * @return
     */
    @Override
    public boolean contains(int toFind) {
//        if (isEmpty()) {
//            return false;
//        }
        for (int i = 0; i < usedSize; i++) {
            if (elem[i] == toFind) {
                return true;
            }
        }
        return false;
    }

    public boolean isEmpty() {
        return usedSize == 0;
    }

    /**
     * 找到数据tofind，返回其下标
     * @param toFind
     * @return
     */
    @Override
    public int indexOf(int toFind) {
        for (int i = 0; i < usedSize; i++) {
            if (elem[i] == toFind) {
                return i;
            }
        }
        return 0;
    }

    @Override
    public int get(int pos) {
        if (pos < 0 || pos >= usedSize) {
            throw new PostOutOfException("pos位置不合法");
        }
        return elem[pos];
    }

    /**
     * 更新
     * @param pos
     * @param value
     */
    @Override
    public void set(int pos, int value) {
        if (pos < 0 || pos >= usedSize) {
            throw new PostOutOfException("set方法中pos位置不合法");
        }
        elem[pos] = value;
    }

    @Override
    public void remove(int toRemove) {

    }

    @Override
    public int size() {
        return usedSize;
    }

    @Override
    public void clear() {

    }

    @Override
    public void display() {
        for (int i = 0; i < usedSize; i++) {
            System.out.print(elem[i] + " ");
        }
        System.out.println();
    }
}

